home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / advanced97 / alphablend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  3.5 KB  |  177 lines

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <GL/glut.h>
  6.  
  7. GLUquadricObj *cone, *base, *qsphere;
  8.  
  9. void init(void)
  10. {
  11.     static GLfloat lightpos[] = {.5, .75, 1.5, 1};
  12.  
  13.     glEnable(GL_DEPTH_TEST); 
  14.     glEnable(GL_LIGHTING);
  15.     glEnable(GL_LIGHT0);
  16.  
  17.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  18.  
  19.     cone = gluNewQuadric();
  20.     base = gluNewQuadric();
  21.     qsphere = gluNewQuadric();
  22.     gluQuadricOrientation(base, GLU_INSIDE);
  23.  
  24.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  25. }
  26.  
  27. void reshape(GLsizei w, GLsizei h) 
  28. {
  29.     glViewport(0, 0, w, h);
  30.   
  31.     glMatrixMode(GL_PROJECTION);
  32.     glLoadIdentity();
  33.     gluPerspective(60, 1, .01, 10);
  34.     gluLookAt(0, 0, 2.577, 0, 0, -5, 0, 1, 0);
  35.   
  36.     glMatrixMode(GL_MODELVIEW);
  37.     glLoadIdentity();
  38. }
  39.  
  40. void draw_room(void)
  41. {
  42.     /* material for the walls, floor, ceiling */
  43.     static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};
  44.  
  45.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
  46.  
  47.     glBegin(GL_QUADS);
  48.   
  49.   /* floor */
  50.     glNormal3f(0, 1, 0);
  51.     glVertex3f(-1, -1, 1);
  52.     glVertex3f(1, -1, 1);
  53.     glVertex3f(1, -1, -1);
  54.     glVertex3f(-1, -1, -1);
  55.  
  56.     /* ceiling */
  57.     glNormal3f(0, -1, 0);
  58.     glVertex3f(-1, 1, -1);
  59.     glVertex3f(1, 1, -1);
  60.     glVertex3f(1, 1, 1);
  61.     glVertex3f(-1, 1, 1);  
  62.  
  63.     /* left wall */
  64.     glNormal3f(1, 0, 0);
  65.     glVertex3f(-1, -1, -1);
  66.     glVertex3f(-1, -1, 1);
  67.     glVertex3f(-1, 1, 1);
  68.     glVertex3f(-1, 1, -1);
  69.  
  70.     /* right wall */
  71.     glNormal3f(-1, 0, 0);
  72.     glVertex3f(1, 1, -1);
  73.     glVertex3f(1, 1, 1);
  74.     glVertex3f(1, -1, 1);
  75.     glVertex3f(1, -1, -1);
  76.  
  77.     /* far wall */
  78.     glNormal3f(0, 0, 1);
  79.     glVertex3f(-1, -1, -1);
  80.     glVertex3f(1, -1, -1);
  81.     glVertex3f(1, 1, -1);
  82.     glVertex3f(-1, 1, -1);
  83.  
  84.     glEnd();
  85. }
  86.  
  87. void draw_cone(void)
  88. {
  89.     static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
  90.  
  91.     glPushMatrix();
  92.     glTranslatef(0, -1, 0);
  93.     glRotatef(-90, 1, 0, 0);
  94.  
  95.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  96.     gluCylinder(cone, .3, 0, 1.25, 20, 1);
  97.     gluDisk(base, 0., .3, 20, 1); 
  98.  
  99.     glPopMatrix();
  100. }
  101.  
  102. void draw_sphere(GLdouble angle)
  103. {
  104.     static GLfloat sphere_mat[] = {1.f, .5f, 0.f, .5f};
  105.  
  106.     glPushMatrix();
  107.     glTranslatef(0, -.3, 0);
  108.     glRotatef(angle, 0, 1, 0);
  109.     glTranslatef(0, 0, .6);
  110.  
  111.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
  112.     gluSphere(qsphere, .3, 20, 20);
  113.  
  114.     glPopMatrix();
  115. }
  116.  
  117. GLdouble get_secs(void)
  118. {
  119.     return glutGet(GLUT_ELAPSED_TIME)/1000.0;
  120. }
  121.  
  122. void draw(void)
  123. {
  124.     GLenum err;
  125.     GLdouble secs;
  126.  
  127.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  128.  
  129.     draw_room();
  130.     draw_cone();
  131.  
  132.     secs = get_secs();
  133.     glEnable(GL_BLEND);
  134.     glEnable(GL_CULL_FACE);
  135.     glCullFace(GL_FRONT);
  136.     draw_sphere(secs * 360. / 10.);
  137.     glCullFace(GL_BACK);
  138.     draw_sphere(secs * 360. / 10.);
  139.     glDisable(GL_CULL_FACE);
  140.     glDisable(GL_BLEND);
  141.  
  142.     err = glGetError();
  143.     if (err != GL_NO_ERROR) printf("Error:  %s\n", gluErrorString(err));
  144.  
  145.     glutSwapBuffers();
  146. }
  147.  
  148. /* ARGSUSED1 */
  149. void key(unsigned char key, int x, int y)
  150. {
  151.     static int idle = 1;
  152.     if (key == 27) exit(0);
  153.     idle = (idle == 0);
  154.     if (idle) {
  155.     glutIdleFunc(draw);
  156.     } else {
  157.     glutIdleFunc(0);
  158.     }
  159. }
  160.  
  161. main(int argc, char *argv[])
  162. {
  163.     glutInitWindowSize(512, 512);
  164.     glutInitWindowPosition(0, 0);
  165.     glutInit(&argc, argv);
  166.     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
  167.     glutCreateWindow(argv[0]);
  168.     glutDisplayFunc(draw);
  169.     glutIdleFunc(draw);
  170.     glutKeyboardFunc(key);
  171.     glutReshapeFunc(reshape);
  172.     init();
  173.  
  174.     glutMainLoop();
  175.     return 0;
  176. }
  177.